//给你一个满足下述两条属性的 m x n 整数矩阵： 
//
// 
// 每行中的整数从左到右按非递减顺序排列。 
// 每行的第一个整数大于前一行的最后一个整数。 
// 
//
// 给你一个整数 target ，如果 target 在矩阵中，返回 true ；否则，返回 false 。 
//
// 
//
// 示例 1： 
// 
// 
//输入：matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
//输出：true
// 
//
// 示例 2： 
// 
// 
//输入：matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
//输出：false
// 
//
// 
//
// 提示： 
//
// 
// m == matrix.length 
// n == matrix[i].length 
// 1 <= m, n <= 100 
// -10⁴ <= matrix[i][j], target <= 10⁴ 
// 
//
// Related Topics 数组 二分查找 矩阵 👍 840 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2023-09-07 22:58:06
 * @description 74.搜索二维矩阵
 */
public class SearchA2dMatrix{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 Solution solution = new SearchA2dMatrix().new Solution();
		int [][]m=new int[][] {{1,3}};
		 System.out.println(solution.searchMatrix(m,3));

	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
		int j=matrix[0].length-1;
		int i=0;
		while (i<matrix.length&&j>=0){
			if(matrix[i][j]==target) return true;
			if(matrix[i][j]<target){
				i++;
			}else {
				j--;
			}
		}
		return false;
    }
	/*对每一行二分查找  时间O（mlogn)*/
	public boolean searchMatrix1(int[][] matrix, int target) {
		for (int[] row : matrix) {
			if(search(row, target)){
				return true;
			}
		}
		return false;
	}
	private  boolean search(int[] nums,int k){
		int l=0,r=nums.length-1;
		while(l<=r){
			int  m=l+(r-l)/2;
			int num = nums[m];
			if(num==k) {
				return true;
			}else if(num>k){
				r=m-1;
			}else {
				l=m+1;
			}

		}
		return  false;
	}
}
//leetcode submit region end(Prohibit modification and deletion)

}
